composetable: Introduce a parser struct
authorMatthias Clasen <mclasen@redhat.com>
Wed, 7 Jul 2021 13:56:34 +0000 (09:56 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 14 Jul 2021 02:02:33 +0000 (22:02 -0400)
This will be used in the following commits to
beef up Compose file parsing.

gtk/gtkcomposetable.c

index 3e8b6638608202cf6185642780691b2b96fabcac..f053ce8741efb02e800c506b30fe6a8f1ec7558f 100644 (file)
@@ -39,7 +39,6 @@ typedef struct {
   char *value;
 } GtkComposeData;
 
-
 static void
 gtk_compose_data_free (GtkComposeData *compose_data)
 {
@@ -48,10 +47,27 @@ gtk_compose_data_free (GtkComposeData *compose_data)
   g_slice_free (GtkComposeData, compose_data);
 }
 
+typedef struct {
+  GList *sequences;
+} GtkComposeParser;
+
+static GtkComposeParser *
+parser_new (void)
+{
+  GtkComposeParser *parser;
+
+  parser = g_new (GtkComposeParser, 1);
+
+  parser->sequences = NULL;
+
+  return parser;
+}
+
 static void
-gtk_compose_list_element_free (GtkComposeData *compose_data, gpointer data)
+parser_free (GtkComposeParser *parser)
 {
-  gtk_compose_data_free (compose_data);
+  g_list_free_full (parser->sequences, (GDestroyNotify) gtk_compose_data_free);
+  g_free (parser);
 }
 
 static gboolean
@@ -784,43 +800,49 @@ gtk_compose_table_new_with_list (GList   *compose_list,
 GtkComposeTable *
 gtk_compose_table_new_with_file (const char *compose_file)
 {
-  GList *compose_list = NULL;
+  GtkComposeParser *parser;
   GtkComposeTable *compose_table;
   int max_compose_len = 0;
   int n_index_stride = 0;
 
   g_assert (compose_file != NULL);
 
+  compose_table = NULL;
+
   compose_table = gtk_compose_table_load_cache (compose_file);
   if (compose_table != NULL)
     return compose_table;
 
-  compose_list = gtk_compose_list_parse_file (compose_file);
-  if (compose_list == NULL)
-    return NULL;
-  compose_list = gtk_compose_list_check_duplicated (compose_list);
-  compose_list = gtk_compose_list_check_uint16 (compose_list);
-  compose_list = gtk_compose_list_format_for_gtk (compose_list,
-                                                  &max_compose_len,
-                                                  &n_index_stride);
-  compose_list = g_list_sort_with_data (compose_list,
-                                        (GCompareDataFunc) gtk_compose_data_compare,
-                                        GINT_TO_POINTER (max_compose_len));
-  if (compose_list == NULL)
+  parser = parser_new ();
+
+  parser->sequences = gtk_compose_list_parse_file (compose_file);
+  if (parser->sequences == NULL)
+    goto out;
+
+  parser->sequences = gtk_compose_list_check_duplicated (parser->sequences);
+  parser->sequences = gtk_compose_list_check_uint16 (parser->sequences);
+  parser->sequences = gtk_compose_list_format_for_gtk (parser->sequences,
+                                                       &max_compose_len,
+                                                       &n_index_stride);
+  parser->sequences = g_list_sort_with_data (parser->sequences,
+                                             (GCompareDataFunc) gtk_compose_data_compare,
+                                             GINT_TO_POINTER (max_compose_len));
+  if (parser->sequences == NULL)
     {
       g_warning ("compose file %s does not include any keys besides keys in en-us compose file", compose_file);
-      return NULL;
+      goto out;
     }
 
-  compose_table = gtk_compose_table_new_with_list (compose_list,
+  compose_table = gtk_compose_table_new_with_list (parser->sequences,
                                                    max_compose_len,
                                                    n_index_stride,
                                                    g_str_hash (compose_file));
 
-  g_list_free_full (compose_list, (GDestroyNotify) gtk_compose_list_element_free);
-
   gtk_compose_table_save_cache (compose_table);
 
+out:
+  parser_free (parser);
+
   return compose_table;
 }